home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / DRIVES.SWG / 0082_VOLUME LABEL Program.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-25  |  3KB  |  71 lines

  1. {
  2. >Can someone please tell me how to read the volume label off a hard
  3. >disk or floppy. I haven't been able to find any information on how
  4. >to do this.  Thanks for any help you can offer.
  5.  
  6.  Here's one way, which is valid for DOS 3.0 or higher...
  7.  
  8. }
  9. PROGRAM VOLAB;                    { Read a disk volume label (TP4+) }
  10.                                   { June 12, 1994. Greg Vigneault   }
  11. USES  Dos;                              { import MsDos, Registers   }
  12. TYPE  ASCIIZ  = ARRAY [0..255] OF CHAR; { ASCIIZ strings            }
  13. CONST TAB     = #9;                     { ASCII horizontal tab      }
  14. VAR   Drv     : CHAR;                   { drive letter 'A'..'Z'     }
  15.       Volume  : STRING;                 { for volume label          }
  16.       Reg     : Registers;              { to access CPU registers   }
  17.  
  18. PROCEDURE Asciiz2TP (AStr:ASCIIZ; VAR Temp:STRING);
  19.   { convert an ASCIIZ (DOS) string to a TP string }
  20.   VAR Index:BYTE; BEGIN  Index := 0;
  21.     WHILE (Index < 255) AND (AStr[Index] <> #0) DO BEGIN
  22.       Temp[Index+1] := AStr[Index];;  INC(Index);
  23.     END{WHILE};;  Temp[0] := CHR(Index);
  24.   END {Asciiz2TP};
  25.  
  26. PROCEDURE TP2Asciiz (TStr:STRING; VAR Temp:ASCIIZ);
  27.   { convert a TP string to an ASCIIZ (DOS) string }
  28.   VAR Index:BYTE; BEGIN Index := ORD(TStr[0]);; Temp[Index] := #0;
  29.     WHILE (Index > 0) DO BEGIN
  30.       Temp[Index-1] := TStr[Index];;  DEC(Index);
  31.     END{WHILE};
  32.   END {TP2Asciiz};
  33.  
  34. FUNCTION GetVolLabel (Drv:CHAR):STRING;
  35.   VAR Temp:ASCIIZ; Temp2:STRING; Index:BYTE;  seg0,ofs0:WORD;
  36.       DTA : ARRAY [0..127] OF CHAR; BEGIN  Temp2 := '';
  37.     IF Drv IN ['A'..'Z'] THEN BEGIN       { valid drive spec?       }
  38.       Reg.AH := $2F;; MsDos(Reg);         { get current DTA address }
  39.       seg0 := Reg.ES;; ofs0 := Reg.BX;    { save the orig DTA       }
  40.       Reg.DS := SEG(DTA);; Reg.DX := OFS(DTA);  { our local DTA     }
  41.       Reg.AH := $1A;; MsDos(Reg);               { activate our DTA  }
  42.       Temp2 := '?:\*.*';; Temp2[1] := Drv;      { build filespec    }
  43.       TP2Asciiz (Temp2, Temp);                  { xlate to ASCIIZ   }
  44.       Reg.DS := SEG(Temp);; Reg.DX := OFS(Temp);; Reg.CX := 8;
  45.       Reg.AH := $4E;; MsDos(Reg); { label search, then reset DTA... }
  46.       Reg.DS := seg0;; Reg.DX := ofs0;; Reg.AH := $1A;; MsDos(Reg);
  47.       IF NOT ODD(Reg.FLAGS) { no DOS error? }
  48.         THEN FOR Index := $1E TO $2A DO Temp[Index-$1E] := DTA[Index]
  49.         ELSE Temp[0] := #0;             { if no volume label found  }
  50.       Asciiz2TP(Temp, Temp2);           { xlate DOS to TP string    }
  51.       IF (Length(Temp2) > 8) AND (Temp2[9] = '.') { if 8/3 format   }
  52.         THEN Delete (Temp2,9,1);
  53.     END{IF Drv};
  54.     GetVolLabel := Temp2;
  55.   END {GetVolLabel};
  56.  
  57. BEGIN {VOLAB: here we go...}
  58.  
  59.   WriteLn;; WriteLn (TAB,'ReadVOL v0.01 Greg Vigneault');; WriteLn;
  60.   REPEAT
  61.     Write (TAB,'Read volume label from which drive [A..Z] ? ');
  62.     Read (Drv);;  Drv := UpCase(Drv);
  63.   UNTIL Drv IN ['A'..'Z'];
  64.   Volume := GetVolLabel (Drv);;  WriteLn;
  65.   IF Length(Volume) <> 0
  66.     THEN WriteLn (TAB,'Volume in drive ',Drv,': is ', Volume)
  67.     ELSE WriteLn (TAB,'No label for volume in drive ',Drv,':');
  68.   WriteLn;
  69.  
  70. END {VOLAB}.
  71.